import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author zyj
 * @date 2022年06月06日 14:27
 */
public class CallableDemo {
    public static void main(String[] args) {
        //Callable来创建线程 当线程执行完以后有返回值
        //1、创建一个线程类 实现Callable接口，
        // 泛型接口，你线程的返回值类型就是这个泛型的类型
        //2、实现call方法，线程执行的代码
        //3、创建线程类的对象
        MyCallable callable = new MyCallable();
        //4、通过callable对象来创建FutureTask对象
        // FutureTask的泛型类型是Callable的泛型类型
        FutureTask<Integer> task = new FutureTask<>(callable);
        //5、由于FutureTask类实现了RunnableFuture，
        // 而RunnableFuture接口继承了Runnable接口
        //所以咱们可以通过FutureTask的对象来创建一个Thread对象
        Thread thread = new Thread(task,"线程A");
        thread.start();
        //获取线程的返回值 通过FutureTask对象调用get方法来获取返回值
        try {
            System.out.println(task.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }


    }
}

class MyCallable implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "开始执行");
       int sum = 0;
        for (int i = 1; i <= 100; i++) {
            Thread.sleep(50);
            sum += i;
        }
        System.out.println(Thread.currentThread().getName() + "执行结束");
        return sum;
    }
}
